package com.kaifamiao.reflect;

import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.Modifier;

public class AccessInstanceField {

    public static void main(String[] args) throws Exception {

        final Class<?> x = Sheep.class;

        Constructor<?> con = x.getDeclaredConstructor(String.class );
        if( !Modifier.isPublic(con.getModifiers()) ) {
            con.setAccessible(true);
        }
        final Object instance = con.newInstance("喜羊羊");

        final Field f = x.getDeclaredField( "name" );
        final int mod = f.getModifiers();
        
        // 若 f 对应的字段是 static 修饰的，则直接终止 main 方法
        if( Modifier.isStatic( mod ) ) {
            return;
        }

        // 若 f 对应的字段不是 public 修饰
        if( !Modifier.isPublic( mod ) ) {
            f.setAccessible( true );
        }

        // 获得 instance 实例中 f 对应的字段的值
        Object value = f.get( instance ); // Object value = instance.name;
        System.out.println( value );

        // 为 instance 实例的 f 字段赋值
        f.set( instance, "沸羊羊" ); // instance.name = "沸羊羊";

        value = f.get( instance ); // Object value = instance.name;
        System.out.println( value );

    }

}
